iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 15
0
DevOps

30 天入門 Ansible 及 Jenkins-CI系列 第 15

[Day 15] 安全性與便利性的平衡

  • 分享至 

  • xImage
  •  

===== 2018 年版本已更新 =====
2018 鐵人賽傳送門:https://ithelp.ithome.com.tw/users/20103346/ironman/1473
GitBook 傳送門:https://www.gitbook.com/book/tsoliangwu0130/learn-ansible-and-jenkins-in-30-days/details
=========================
在上一個章節中透過 Ansible 安裝好所有 Jenkins 建議插件後,現在只剩下建立 admin 使用者就能完全自動化我們的 Jenkins 安裝流程了,然而,在建立自動化系統的時候,真的只需要把所有任務翻譯成自動化腳本就好了嗎?

所有步驟都適合被自動化嗎?

我們在初始化 Jenkins 的過程中透過了網頁介面新增了我們的 admin 使用者。而這個使用者的資料被存放於 /var/lib/jenkins/users/admin/config.xml 的檔案中(在 Jenkins 中,我們是以 XML (Extensible Markup Language) 的格式存放所有設定檔):

<?xml version='1.0' encoding='UTF-8'?>
<user>
  <fullName>Admin</fullName>
  <properties>
    <jenkins.security.ApiTokenProperty>
      <apiToken>tUKagIUGUAaJJjO9X/xx6i9HrT/YbvMkc3Ba+pN/Xc2Vpng0oqoNXjBP1uNKsI5X</apiToken>
    </jenkins.security.ApiTokenProperty>
    <com.cloudbees.plugins.credentials.UserCredentialsProvider_-UserCredentialsProperty plugin="credentials@2.1.10">
      <domainCredentialsMap class="hudson.util.CopyOnWriteMap$Hash"/>
    </com.cloudbees.plugins.credentials.UserCredentialsProvider_-UserCredentialsProperty>
    <hudson.plugins.emailext.watching.EmailExtWatchAction_-UserProperty plugin="email-ext@2.52">
      <triggers/>
    </hudson.plugins.emailext.watching.EmailExtWatchAction_-UserProperty>
    <hudson.model.MyViewsProperty>
      <views>
        <hudson.model.AllView>
          <owner class="hudson.model.MyViewsProperty" reference="../../.."/>
          <name>All</name>
          <filterExecutors>false</filterExecutors>
          <filterQueue>false</filterQueue>
          <properties class="hudson.model.View$PropertyList"/>
        </hudson.model.AllView>
      </views>
    </hudson.model.MyViewsProperty>
    <hudson.model.PaneStatusProperties>
      <collapsed/>
    </hudson.model.PaneStatusProperties>
    <hudson.search.UserSearchProperty>
      <insensitiveSearch>false</insensitiveSearch>
    </hudson.search.UserSearchProperty>
    <hudson.security.HudsonPrivateSecurityRealm_-Details>
      <passwordHash>#jbcrypt:$2a$10$lkFzobXmlTOLAQS2zNFpcOrs5Jqgp6Ce9OVakQOeltvdazMzvZY7y</passwordHash>
    </hudson.security.HudsonPrivateSecurityRealm_-Details>
    <hudson.tasks.Mailer_-UserProperty plugin="mailer@1.18">
      <emailAddress>admin@example.com</emailAddress>
    </hudson.tasks.Mailer_-UserProperty>
  </properties>
</user>

我們可以從瀏覽器上訪問 http://localhost:9080/me/configure 來看到以上設定檔的視覺畫面:

jenkins_06

在這個檔案內存放了所有 admin 這個使用者的所有資料。雖然我們還是大可以直接將這個 admin 設定檔複製下來並讓 Ansible 直接利用 template 這個內建模組部署到對應的位置以完成完全自動化的目的,但除了其中 fullNameemailAddress 這兩個標籤下的內容與我們當初建立使用者時輸入的資料完全一致外,我們還可以發現在這個檔案中,其實存放了兩個機密資料: apiToken 以及 passwordHash。一般而言,這種資料是不該公開給所有開發者知道的,尤其是系統的 admin。即便密碼是經過加密保護的,對於知道加密規則的人而言,有了這份設定檔無異於等於有了 admin 使用者權限。如果今天我們並不希望能夠存取這份 playbook / role 的人都擁有 admin 的權限,從安全性的角度上出發,我們就不應該將密碼及 API 這種憑證 (credential) 資料直接暴露在自動化部署的腳本中。

當我們在設計自動化腳本的時候,我們必須時時刻刻問自己一個問題:**現在的步驟適合被自動化嗎?**有太多時候,因為過度追求步驟自動化而忽略的資訊安全的重要性,進而導致系統出現安全漏洞,這些都不是我們在追求自動化部署時的初衷。因此,在這種狀況下,與其為了增加自動部署的方便性而犧牲系統安全,我們寧可將這種步驟仍然保持手動操作,以避免系統出現致命的安全漏洞。

因此,在章節的最後,讀者可以嘗試重新運行 jenkins role 在一個新的虛擬主機上,來觀察目前為止我們的完成事項。大致上,我們只要在遙控節點上成功運行了 jenkins role,Ansible 就會自動部署好 Jenkins 及系統所需服務,以及安裝所有建議插件。我們唯一需要手動操作的就是取得 Jenkins 預設的密碼,並創建我們的 admin 用戶。

Ansible 總結

至此,Ansible 的基本概念因為篇幅的關係需要先告一段落了。希望讀者透過自動安裝及初始化 Jenkins 這個簡單的例子,能夠大概了解 Ansible 的基本運作流程。雖然沒辦法把所有 Ansible 的所有語法與細節技巧在上述章節內一一列出,但在未來 Jenkins 的章節內,我還是依然會透過實際的例子在必要的時候介紹更多的 Ansible 的部署技巧。


上一篇
[Day 14] 使用 Ansible 安裝 Jenkins 插件
下一篇
[Day 16] Jenkins 介紹
系列文
30 天入門 Ansible 及 Jenkins-CI30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言